/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */

package dao;

import conexiones.AdministradorDeConexiones;
import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Statement;
import java.util.ArrayList;
import modelo.Articulo;
import modelo.Rubro;

/**
 *
 * @author Cristian Perez
 */
public class ArticulosDao {
    private static ArticulosDao instance = null;

    public ArticulosDao() {
        //Instanciacion de Singleton
    }

    public static ArticulosDao getInstance() {
        if (instance == null) {
            instance = new ArticulosDao();
        }
        return instance;
    }

    public void insertar(Connection c, Articulo a) throws SQLException {
        PreparedStatement pstmt = null;
        try {
            String query = "INSERT INTO articulos (codigo, descripcion, precioCosto, porcentaje, precioVenta, stockAct, stockMin, idRubro) VALUES (?,?,?,?,?,?,?,?)";
            pstmt = c.prepareStatement(query);
            pstmt.setLong(1, a.getCod());
            pstmt.setString(2, a.getDescrip().toUpperCase().trim());
            pstmt.setFloat(3, a.getPreCosto());
            pstmt.setFloat(4, a.getPorc());
            pstmt.setFloat(5, a.getPreVenta());
            pstmt.setInt(6, a.getStkAct());
            pstmt.setInt(7, a.getStkMin());
            pstmt.setInt(8, a.getRubro().getCod());
            pstmt.execute();
        }catch(Exception e) {e.printStackTrace();}
    }

    public void eliminar(Connection c, Articulo art) throws SQLException {
        Statement stmt = null;
        try {
            String query = "DELETE FROM articulos WHERE codigo='"+art.getCod()+"'";
            stmt = c.createStatement();
            stmt.execute(query);
        }catch(Exception e){e.printStackTrace();}
        finally {
            try {
                stmt.close();
            }catch(Exception ee) {}
        }
    }

    public void modificar(Connection c, Articulo art) throws SQLException {
        PreparedStatement pstmt = null;
        try {
            String query = "UPDATE articulos SET descripcion = ?, precioCosto = ?, porcentaje = ?, precioVenta = ?, stockAct = ?, stockMin = ?, idRubro = ? WHERE codigo='"+art.getCod()+"'";
            pstmt = c.prepareStatement(query);
            pstmt.setString(1, art.getDescrip().toUpperCase().trim());
            pstmt.setFloat(2, art.getPreCosto());
            pstmt.setFloat(3, art.getPorc());
            pstmt.setFloat(4, art.getPreVenta());
            pstmt.setInt(5, art.getStkAct());
            pstmt.setInt(6, art.getStkMin());
            pstmt.setInt(7, art.getRubro().getCod());
            pstmt.execute();
        }catch(Exception e) {e.printStackTrace();}
        finally {
            try {
                pstmt.close();
            }catch(Exception em) {}
        }
    }

    public ArrayList getTodos (Connection c) throws SQLException, Exception {
        //Creo la variable lista donde la consulta me va a devolver los registros
        ArrayList lista = new ArrayList();
        Statement stmtConsulta = null;

        //Creo la consulta
            String laConsulta = "SELECT * FROM articulos ORDER BY descripcion ASC";
            //Creo la sentencia
            stmtConsulta = c.createStatement();
            //Ejecuto la sentencia con la consulta como parametro y almaceno el resultado en una variable de tipo ResultSet
            ResultSet rs = stmtConsulta.executeQuery(laConsulta);

            Rubro rub = null;
            //Cargo la lista
            while (rs.next()) {
                rub = RubrosDao.getInstance().getRubroXcodigo(c, rs.getInt("idRubro"));
                Articulo aluAux = new Articulo(rs.getLong("codigo"),rs.getString("descripcion"), rs.getFloat("precioCosto"), rs.getFloat("porcentaje"), rs.getFloat("precioVenta"), rs.getInt("stockAct"), rs.getInt("stockMin"), rub);
                lista.add(aluAux);
            }
            stmtConsulta.close();
            //Retorno la lista
            return lista;
    }

    public ArrayList getArtDebajoSMinimo (Connection c) throws SQLException, Exception {
        //Creo la variable lista donde la consulta me va a devolver los registros
        ArrayList lista = new ArrayList();
        Statement stmtConsulta = null;

        //Creo la consulta
            String laConsulta = "SELECT * FROM articulos WHERE (stockAct <= stockMin)";
            //Creo la sentencia
            stmtConsulta = c.createStatement();
            //Ejecuto la sentencia con la consulta como parametro y almaceno el resultado en una variable de tipo ResultSet
            ResultSet rs = stmtConsulta.executeQuery(laConsulta);

            Rubro rub = null;
            //Cargo la lista
            while (rs.next()) {
                rub = RubrosDao.getInstance().getRubroXcodigo(c, rs.getInt("idRubro"));
                Articulo aluAux = new Articulo(rs.getLong("codigo"),rs.getString("descripcion"), rs.getFloat("precioCosto"), rs.getFloat("porcentaje"), rs.getFloat("precioVenta"), rs.getInt("stockAct"), rs.getInt("stockMin"), rub);
                lista.add(aluAux);
            }
            stmtConsulta.close();
            //Retorno la lista
            return lista;
    }

    public Articulo getArticuloXcodigo (Connection c, long cod) throws SQLException {
        Statement stmtConsulta = null;
        Articulo artAux = null;
        //Creo la consulta
        String laConsulta = "SELECT * FROM articulos WHERE codigo='"+cod+"'";
        //Creo la sentencia
        stmtConsulta = c.createStatement();
        //Ejecuto la sentencia con la consulta como parametro y almaceno el resultado en una variable de tipo ResultSet
        ResultSet rs = stmtConsulta.executeQuery(laConsulta);

        if (rs.next()) {
            Rubro rub = RubrosDao.getInstance().getRubroXcodigo(c, rs.getInt("idRubro"));
            artAux = new Articulo(rs.getLong("codigo"),rs.getString("descripcion"), rs.getFloat("precioCosto"), rs.getFloat("porcentaje"), rs.getFloat("precioVenta"), rs.getInt("stockAct"),  rs.getInt("stockMin"), rub);
        }
        return artAux;
    }

    public ArrayList getArticuloXstring (Connection c, String var) throws SQLException {
        Statement stmtConsulta = null;
        ArrayList lista = new ArrayList();
        //Creo la consulta
        String laConsulta = "SELECT * FROM articulos WHERE descripcion like '%"+var+"%'";
        //Creo la sentencia
        stmtConsulta = c.createStatement();
        //Ejecuto la sentencia con la consulta como parametro y almaceno el resultado en una variable de tipo ResultSet
        ResultSet rs = stmtConsulta.executeQuery(laConsulta);
        Rubro rub = null;
        while (rs.next()) {
            rub = RubrosDao.getInstance().getRubroXcodigo(c, rs.getInt("idRubro"));
            Articulo aluAux = new Articulo(rs.getLong("codigo"),rs.getString("descripcion"), rs.getFloat("precioCosto"), rs.getFloat("porcentaje"), rs.getFloat("precioVenta"), rs.getInt("stockAct"), rs.getInt("stockMin"), rub);
            lista.add(aluAux);
        }
        stmtConsulta.close();
        return lista;
    }

    public boolean verificarExistenciaArt (Connection c, long cod) throws SQLException {
        Statement stmtConsulta = null;
        //Creo la consulta
        String laConsulta = "SELECT * FROM articulos WHERE codigo='"+cod+"'";
        //Creo la sentencia
        stmtConsulta = c.createStatement();
        //Ejecuto la sentencia con la consulta como parametro y almaceno el resultado en una variable de tipo ResultSet
        ResultSet rs = stmtConsulta.executeQuery(laConsulta);

        if (rs.next()) {
            stmtConsulta.close();
            return true;
        }else {
            stmtConsulta.close();
            return false;
        }
    }

    public boolean existeFiltroArt (Connection c, String var) throws SQLException {
        Statement stmtConsulta = null;
        ArrayList lista = new ArrayList();
        boolean existe = false;
        try {
            //Creo la consulta
            String laConsulta = "SELECT * FROM articulos WHERE descripcion like '%"+var+"%'";
            //Creo la sentencia
            stmtConsulta = c.createStatement();
            //Ejecuto la sentencia con la consulta como parametro y almaceno el resultado en una variable de tipo ResultSet
            ResultSet rs = stmtConsulta.executeQuery(laConsulta);
            if (rs.next()) {
                existe = true;
            }
        }catch(Exception e) {e.printStackTrace();}
        finally {
            try {
                stmtConsulta.close();
            }catch(Exception ee) {}
        }
        return existe;
    }

    public void actualizarStock (Connection c) {
        Statement stmt = null;
        try {
            String query = "SELECT cantidad, idArt FROM ventas";
            stmt = c.createStatement();
            ResultSet rs = stmt.executeQuery(query);
            while (rs.next()) {
                //Recupero el articulo de la base
                Articulo artAux = ArticulosDao.getInstance().getArticuloXcodigo(c, rs.getLong("idArt"));
                //Al stock actual del articulo le incremento el de la tabla ventas
                int stkActual = artAux.getStkAct();
                int cant = rs.getInt("cantidad");
                artAux.setStkAct(stkActual - cant);
                ArticulosDao.getInstance().modificar(c, artAux);
            }
        }catch(Exception e) {e.printStackTrace();}
        finally {
            try {
                stmt.close();
            }catch(Exception ee) {}
        }
    }

    public boolean existeRubroEnArticulo (Connection c, Rubro rub) {
        Statement stmt = null;
        boolean existe = false;
        try {
            String query = "SELECT idRubro FROM articulos WHERE idRubro='"+rub.getCod()+"'";
            stmt = c.createStatement();
            ResultSet rs = stmt.executeQuery(query);
            if (rs.next()) {
                existe = true;
            }
        }catch(Exception e) {e.printStackTrace();}
        finally {
            try {
                stmt.close();
            }catch(Exception ee) {}
        }
        return existe;
    }

    public ArrayList devolverArticulosXrubro(Connection c, Rubro rub) {
        Statement stmt = null;
        ArrayList lista = new ArrayList();
        try {
            String query = "SELECT * FROM articulos WHERE idRubro='"+rub.getCod()+"'";
            stmt = c.createStatement();
            ResultSet rs = stmt.executeQuery(query);
            while (rs.next()) {
                Articulo art = new Articulo(rs.getLong("codigo"), rs.getString("descripcion"), rs.getFloat("precioCosto"), rs.getFloat("porcentaje"), rs.getFloat("precioVenta"), rs.getInt("stockAct"), rs.getInt("stockMin"), rub);
                lista.add(art);
            }
        }catch(Exception e) {e.printStackTrace();}
        finally {
            try {
                stmt.close();
            }catch(Exception ee) {}
        }
        return lista;
    }


}
